#ifndef FIELD_H
#define FIELD_H

#include <QString>

class Field
{
public:
    enum Type
    {
        invalid,
        b1,b2,b3,b4,b5,b6,b7,
        i8, i16, i32, i64,
        u8, u16, u32, u64,
        bcd,    // Reinterpret u8
    };
    static const Field Invalid;

    Type getType() const;
    void setType(Type newType);
    bool setType(const QString &);

    int getOffset() const;
    void setOffset(int newOffset);

    QString getPid() const;
    void setPid(const QString &newPid);

    QByteArray getRaw() const;
    void setRaw(const QByteArray &newRaw) const;

    QString getId() const;
    void setId(const QString &newId);

    QString getName() const;
    void setName(const QString &newName);

    double getFactor() const;
    void setFactor(double newFactor);

    QString getUnit() const;
    void setUnit(const QString &newUnit);

    int getFieldWidth() const;
    void setFieldWidth(int newFieldWidth);

    int getPrecision() const;
    void setPrecision(int newPrecision);


    double getDispatchVal() const;
    void setDispatchVal(double newDispatchVal);

    uint64_t getHitVal() const;
    void setHitVal(uint64_t newHitVal);

private:
    // 在 datagram 数据报中的位置 byteOffset / 在 integer value 中的位置 bitOffset
    int offset = 0;
    Type type = Type::invalid;
    // 针对 bitField ，保存其所在 byteField 的 id ；针对 byteField，其值为空
    QString pid;
    QString id;
    QString name;
    double factor = 1.0;
    // format
    QString unit;
    int fieldWidth = 0; // QString::arg()
    int precision = -1;
    // default value when sending
    double dispatchVal = .0;
    // expected value / filter
    uint64_t hitVal;
    char raw[sizeof(uint16_t)];
};

#endif // FIELD_H
